package dbops

import (
	"database/sql"
	"fmt"
)

//创建用户表
func CreateUserTable(db *sql.DB) error {
	_, err := db.Exec(`CREATE TABLE IF NOT EXISTS table_user (
	    id INT(64) NOT NULL AUTO_INCREMENT COMMENT '数据id',
	    user_id VARCHAR(64) NOT NULL  COMMENT '用户id',
	    account VARCHAR(64) NULL DEFAULT NULL COMMENT '用户账号',
	    pwd VARCHAR(64) NULL DEFAULT NULL COMMENT '用户密码',
		name VARCHAR(64) NULL DEFAULT '未设置名称',
	    created TIMESTAMP NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
	    PRIMARY KEY (id)
	)AUTO_INCREMENT = 0`)
	_ = AddColumn(db, "table_user", "job_number", "", "工号")
	_ = AddColumn(db, "table_user", "phone_number", "", "电话号码")
	_ = AddColumn(db, "table_user", "head_portrait", "", "头像")
	_ = AddColumn(db, "table_user", "credential_type", "", "证件类型")
	_ = AddColumn(db, "table_user", "credential_number", "", "证件号码")
	return err
}

//创建权限表
func CreatePermissionTable(db *sql.DB) error {
	_, err := db.Exec(`CREATE TABLE IF NOT EXISTS table_tree_permission (
	    id INT(64) NOT NULL AUTO_INCREMENT COMMENT 'id',
	    permission_id VARCHAR(64) NULL DEFAULT NULL COMMENT '权限id',
	    permission_parent_id VARCHAR(64) NULL DEFAULT NULL COMMENT '权限父id',
	    permission_name VARCHAR(64) NULL DEFAULT NULL COMMENT '权限名字',
	    permission_code VARCHAR(64) NULL DEFAULT NULL COMMENT '权限代号',
	    created TIMESTAMP NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
	    PRIMARY KEY (id)
	)AUTO_INCREMENT = 10000`)
	return err
}

//创建权限角色表
func CreateCharacterTable(db *sql.DB) error {
	_, err := db.Exec(`CREATE TABLE IF NOT EXISTS table_character (
	    id INT(64) NOT NULL AUTO_INCREMENT COMMENT 'id',
	    name VARCHAR(64) NULL DEFAULT NULL COMMENT '角色名称',
	    created TIMESTAMP NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
	    PRIMARY KEY (id)
	)AUTO_INCREMENT = 10000`)
	return err
}

//创建权限角色与权限的表
func CreatePermissionUserTable(db *sql.DB) error {
	_, err := db.Exec(`CREATE TABLE IF NOT EXISTS table_character_permission (
	    id INT(64) NOT NULL AUTO_INCREMENT COMMENT 'id',
	    character_id VARCHAR(64) NULL DEFAULT NULL COMMENT '角色id',
	    permission_id VARCHAR(64) NULL DEFAULT NULL COMMENT '权限id',
	    created TIMESTAMP NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
	    PRIMARY KEY (id),UNIQUE KEY (character_id,permission_id)
	)AUTO_INCREMENT = 10000`)
	return err
}

//创建组织树表
func CreateStructureTreeTable(db *sql.DB) error {
	_, err := db.Exec(`CREATE TABLE IF NOT EXISTS table_tree_structure (
	    id INT(64) NOT NULL AUTO_INCREMENT COMMENT '数据id',
	    node_id VARCHAR(64) NULL DEFAULT NULL COMMENT '节点ID',
	    node_name VARCHAR(64) NULL DEFAULT NULL COMMENT '节点名字',
		node_parent_id VARCHAR(64) NULL DEFAULT NULL COMMENT '节点的父id',
		depth INT(64) NULL DEFAULT NULL COMMENT '树的深度,0开始',
	    created TIMESTAMP NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
	    PRIMARY KEY (id)
	)AUTO_INCREMENT = 0`)
	_ = AddColumn(db, "table_tree_structure", "head_user_id", "", "负责人的id")
	return err
}

//创建项目树表
func CreateProjectTreeTable(db *sql.DB) error {
	_, err := db.Exec(`CREATE TABLE IF NOT EXISTS table_tree_project (
	    id INT(64) NOT NULL AUTO_INCREMENT COMMENT '数据id',
	    node_id VARCHAR(64) NULL DEFAULT NULL COMMENT '节点ID',
	    node_name VARCHAR(64) NULL DEFAULT NULL COMMENT '节点名字',
		node_parent_id VARCHAR(64) NULL DEFAULT NULL COMMENT '节点的父id',
		depth INT(64) NULL DEFAULT NULL COMMENT '树的深度,0开始',
	   	created TIMESTAMP NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
	    PRIMARY KEY (id)
	)AUTO_INCREMENT = 0`)
	_ = AddColumn(db, "table_tree_project", "head_user_id", "", "负责人的id")
	_ = AddColumn(db, "table_tree_project", "project_id", "", "项目的id")
	return err
}

//创建文件树表
func CreateFileTreeTable(db *sql.DB) error {
	_, err := db.Exec(`CREATE TABLE IF NOT EXISTS table_tree_file (
	    id INT(64) NOT NULL AUTO_INCREMENT COMMENT '数据id',
	    node_id VARCHAR(64) NULL DEFAULT NULL COMMENT '节点ID',
	    node_name VARCHAR(64) NULL DEFAULT NULL COMMENT '节点名字',
		node_parent_id VARCHAR(64) NULL DEFAULT NULL COMMENT '节点的父id',
		depth INT(64) NULL DEFAULT NULL COMMENT '树的深度,0开始',
	    created TIMESTAMP NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
	    PRIMARY KEY (id)
	)AUTO_INCREMENT = 0`)
	return err
}

//创建文件表
func CreateFileTreeFileTable(db *sql.DB) error {
	_, err := db.Exec(`CREATE TABLE IF NOT EXISTS table_tree_file_file (
	    id INT(64) NOT NULL AUTO_INCREMENT COMMENT '数据id',
	    node_id VARCHAR(64) NULL DEFAULT NULL COMMENT '节点ID',
		file_id VARCHAR(64) NULL DEFAULT NULL COMMENT '文件的id',
	    file_name VARCHAR(64) NULL DEFAULT NULL COMMENT '文件名称',
	    file_path VARCHAR(256) NULL DEFAULT NULL COMMENT '文件路径',
	    created TIMESTAMP NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
	    PRIMARY KEY (id),UNIQUE KEY (node_id,file_id)
	)AUTO_INCREMENT = 0`)
	_ = AddColumn(db, "table_tree_file_file", "work_time", "", "工作的时间")
	_ = AddColumn(db, "table_tree_file_file", "commissioned_user_id", "", "被委托人的id")
	return err
}

//创建组织树与人员的表
func CreateStructureTreeUserTable(db *sql.DB) error {
	_, err := db.Exec(`CREATE TABLE IF NOT EXISTS table_tree_structure_user (
	    id INT(64) NOT NULL AUTO_INCREMENT COMMENT '数据id',
	    node_id VARCHAR(64) NULL DEFAULT NULL COMMENT '组织结构ID',
	    user_id VARCHAR(64)  NULL COMMENT '人员的ID',
	    created TIMESTAMP NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
	    PRIMARY KEY (id),UNIQUE KEY (node_id,user_id)
	)AUTO_INCREMENT = 0 `)
	return err
}

//创建项目树与人员的表
func CreateProjectTreeUserTable(db *sql.DB) error {
	_, err := db.Exec(`CREATE TABLE IF NOT EXISTS table_tree_project_user (
	    id INT(64) NOT NULL AUTO_INCREMENT COMMENT '数据id',
	    node_id VARCHAR(64) NULL DEFAULT NULL COMMENT '组织结构ID',
	    user_id VARCHAR(64)  NULL COMMENT '人员的ID',
	    project_id VARCHAR(64)  NULL COMMENT '项目树的ID',
	    created TIMESTAMP NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
	    PRIMARY KEY (id),UNIQUE KEY (node_id,user_id)
	)AUTO_INCREMENT = 0 `)
	return err
}

//创建签到的表
func CreateAttendanceTable(db *sql.DB) error {
	_, err := db.Exec(`CREATE TABLE IF NOT EXISTS table_attendance_user (
	    id INT(64) NOT NULL AUTO_INCREMENT COMMENT '数据id',
	    user_id VARCHAR(64)  NULL COMMENT '用户的ID',
	    start_time INT(64)  NULL COMMENT '上班时间',
	    end_time INT(64)  NULL COMMENT '下班时间',
	    today_time VARCHAR(64)  NULL COMMENT '今天的时间',
	    created TIMESTAMP NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
	    PRIMARY KEY (id)
	)AUTO_INCREMENT = 0 `)
	return err
}

//创建请假的表
func CreateAttendanceAskForLeaveTable(db *sql.DB) error {
	_, err := db.Exec(`CREATE TABLE IF NOT EXISTS table_attendance_askForLeave (
	    id INT(64) NOT NULL AUTO_INCREMENT COMMENT '数据id',
	    user_id VARCHAR(64)  NULL COMMENT '用户的ID',
	    leave_type INT(32)  NULL COMMENT '请假的类型',
	    leave_reason VARCHAR(256)  NULL COMMENT '请假的理由',
	    start_time INT(64)  NULL COMMENT '开始时间',
	    end_time INT(64)  NULL COMMENT '结束时间',
	    ask_user_id VARCHAR(64)  NULL COMMENT '需要谁同意',
	    ask_result INT(2)  NULL COMMENT '请求的结果,0未处理,1是同意,-1是拒绝',
	    ask_time INT(64)  NULL COMMENT '处理的时间',
	    is_read  INT(2) NULL DEFAULT 0 COMMENT '是否已读,0否,1是',
	    created TIMESTAMP NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
	    PRIMARY KEY (id)
	)AUTO_INCREMENT = 0 `)
	return err
}

//创建消息的表
func CreateMessageTable(db *sql.DB) error {
	_, err := db.Exec(`CREATE TABLE IF NOT EXISTS table_message (
	    id INT(64) NOT NULL AUTO_INCREMENT COMMENT '数据id',
	    message_type INT(32)  NULL COMMENT '消息的类型',
	    to_user_id VARCHAR(64)  NULL COMMENT '发给谁的id',
	    is_read  INT(2) NULL COMMENT '是否已读,0否,1是',
	    message_content  VARCHAR(256) NULL COMMENT '消息的内容',
	    message_append  VARCHAR(256) NULL COMMENT '消息的附加内容',
	    created TIMESTAMP NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
	    PRIMARY KEY (id)
	)AUTO_INCREMENT = 0 `)
	return err
}

//创建委托的流向的表
func CreateCommissionedFlowTable(db *sql.DB) error {
	_, err := db.Exec(`CREATE TABLE IF NOT EXISTS table_commissioned_flow (
	    id INT(64) NOT NULL AUTO_INCREMENT COMMENT '数据id',
	    file_id VARCHAR(64)  NULL COMMENT '文件的id',
	    user_id VARCHAR(64)  NULL COMMENT '用户id',
	    to_user_id VARCHAR(64)  NULL COMMENT '被委托人id',
	    created TIMESTAMP NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
	    PRIMARY KEY (id)
	)AUTO_INCREMENT = 0 `)
	return err
}

//创建消息的表
func CreateChatTable(db *sql.DB) error {
	_, err := db.Exec(`CREATE TABLE IF NOT EXISTS table_chat (
	    id INT(64) NOT NULL AUTO_INCREMENT COMMENT '数据id',
	    form_user_id VARCHAR(64)  NULL COMMENT '发送人的ID',
	    to_user_id VARCHAR(64)  NULL COMMENT '接收人的ID',
	    file_id VARCHAR(64)  NULL COMMENT '消息内部的文件id，方便删除',
	    content MEDIUMTEXT  NULL COMMENT '消息内容',
	    message_type  VARCHAR(64) NULL COMMENT '消息类型，前端定',
	    is_read  INT(2) NULL COMMENT '是否已读,0否,1是',
	    created TIMESTAMP NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
	    PRIMARY KEY (id)
	)AUTO_INCREMENT = 0 `)
	return err
}

//创建合同类型的表
func CreateContractTypeTable(db *sql.DB) error {
	_, err := db.Exec(`CREATE TABLE IF NOT EXISTS table_contract_type (
	    id INT(64) NOT NULL AUTO_INCREMENT COMMENT '数据id',
	    type_name VARCHAR(64)  NULL COMMENT '类型名称',
	    created TIMESTAMP NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
	    PRIMARY KEY (id)
	)AUTO_INCREMENT = 0 `)
	return err
}

//创建工作类型的表
func CreateWorkTypeTable(db *sql.DB) error {
	_, err := db.Exec(`CREATE TABLE IF NOT EXISTS table_work_type (
	    id INT(64) NOT NULL AUTO_INCREMENT COMMENT '数据id',
	    type_name VARCHAR(64)  NULL COMMENT '类型名称',
	    created TIMESTAMP NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
	    PRIMARY KEY (id)
	)AUTO_INCREMENT = 0 `)
	return err
}

//创建合同类型的年
func CreateContractYearTable(db *sql.DB) error {
	_, err := db.Exec(`CREATE TABLE IF NOT EXISTS table_contract_year (
	    id INT(64) NOT NULL AUTO_INCREMENT COMMENT '数据id',
	    htlx VARCHAR(64)  NULL COMMENT '合同类型',
	    year_name VARCHAR(64)  NULL COMMENT '年份日期',
	    created TIMESTAMP NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
	   PRIMARY KEY (id),UNIQUE KEY (htlx,year_name)
	)AUTO_INCREMENT = 0 `)
	return err
}

//创建合同的表
func CreateContractTable(db *sql.DB) error {
	_, err := db.Exec(`CREATE TABLE IF NOT EXISTS table_contract (
	    id INT(64) NOT NULL AUTO_INCREMENT COMMENT '数据id',
	    htlx VARCHAR(64)  NULL COMMENT '合同类型',
	    xmmc VARCHAR(64)  NULL COMMENT '项目名称',
	    no VARCHAR(64)  NULL COMMENT '编号',
	    wtdw VARCHAR(64)  NULL COMMENT '委托单位',
	    fzr VARCHAR(64)  NULL COMMENT '负责人',
	    qsrq VARCHAR(64)  NULL COMMENT '起始日期',
	    qdrq TIMESTAMP NOT NULL DEFAULT current_timestamp COMMENT '签订日期',
	    jbgk MEDIUMTEXT  NULL COMMENT '基本概况',
	    sf VARCHAR(64)  NULL COMMENT '省份',
	    dq VARCHAR(64)  NULL COMMENT '地区',
	    bz MEDIUMTEXT  NULL COMMENT '备注',
	    zxdw VARCHAR(64)  NULL COMMENT '执行单位',
	    tze VARCHAR(64)  NULL COMMENT '投资额',
	    wcrq VARCHAR(64)  NULL COMMENT '完成日期',
	    djrq VARCHAR(64)  NULL COMMENT '登记日期',
	    zxqk VARCHAR(64)  NULL COMMENT '执行情况',
	    htje VARCHAR(64)  NULL COMMENT '合同金额',
	    xz VARCHAR(64)  NULL COMMENT '性质',
	    gznr MEDIUMTEXT  NULL COMMENT '工作内容',
	    wcqk VARCHAR(64)  NULL COMMENT '完成情况',
	    sbqk VARCHAR(64)  NULL COMMENT '上报情况',
	    xxf VARCHAR(64)  NULL COMMENT '信息费',
	    htfj MEDIUMTEXT  NULL COMMENT '"附件,用,隔开',
	    parent_id VARCHAR(64)  NULL COMMENT '"父id',
	    created TIMESTAMP NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
	    PRIMARY KEY (id)
	)AUTO_INCREMENT = 0 `)
	_ = AddColumn(db, "table_contract", "jsje", "", "计算金额")
	return err
}

//创建合同的扩展表
func CreateContractAdditionalTable(db *sql.DB) error {
	_, err := db.Exec(`CREATE TABLE IF NOT EXISTS table_contract_additional (
	    id INT(64) NOT NULL AUTO_INCREMENT COMMENT '数据id',
	    contract_id VARCHAR(64)  NULL COMMENT '合同的ID',
	    lx VARCHAR(64)  NULL COMMENT '类型',
	    jbr VARCHAR(64)  NULL COMMENT '经办人',
	    nr MEDIUMTEXT  NULL COMMENT '内容',	   
	    fsrq VARCHAR(64)  NULL COMMENT '发生日期',
	    htmc VARCHAR(64)  NULL COMMENT '合同名称',	
	    wxdw VARCHAR(64)  NULL COMMENT '外协单位',
	    fpje VARCHAR(64)  NULL COMMENT '发票金额',
	    htfj MEDIUMTEXT  NULL COMMENT '附件,用,隔开',
	    htfl VARCHAR(64)  NULL COMMENT '合同分类',
	    htnr MEDIUMTEXT  NULL COMMENT '合同内容',
	    created TIMESTAMP NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
	    PRIMARY KEY (id)
	)AUTO_INCREMENT = 0 `)
	return err
}

//创建合同的模板表
func CreateContractTemplateTable(db *sql.DB) error {
	_, err := db.Exec(`CREATE TABLE IF NOT EXISTS table_contract_template (
	    id INT(64) NOT NULL AUTO_INCREMENT COMMENT '数据id',
	    name VARCHAR(64)  NULL COMMENT '名称',
	    node_id VARCHAR(64) NULL DEFAULT NULL COMMENT 'ID',
	    template_id VARCHAR(64)  NULL COMMENT '模板ID',
	    parent_id VARCHAR(64) NULL DEFAULT NULL COMMENT '父ID',
	    
	    field_required VARCHAR(64) NULL DEFAULT '0' COMMENT '是否必填0否1是',
	  	field_type VARCHAR(64) NULL DEFAULT NULL COMMENT '字段类型',
	  	field_content VARCHAR(64) NULL DEFAULT NULL COMMENT '字段内容',
	  	field_extension VARCHAR(64) NULL DEFAULT NULL COMMENT '字段的内容',
	    created TIMESTAMP NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
	    PRIMARY KEY (id)
	)AUTO_INCREMENT = 0 `)
	return err
}

func AddColumn(db *sql.DB, tableName, columnName string, defaultValue string, comment string) error {
	result, err := db.Prepare(`SELECT count(*) FROM information_schema.columns WHERE table_name = ? AND column_name = ?`)
	if err != nil {
		return err
	}
	defer result.Close()
	rows, err := result.Query(tableName, columnName)
	if err != nil {
		return err
	}
	defer rows.Close()
	if rows.Next() {
		var num int
		err := rows.Scan(&num)
		if err != nil {
			return err
		}
		if num <= 0 {
			_, err := db.Exec(fmt.Sprintf("ALTER TABLE %v ADD %v VARCHAR(64) NULL DEFAULT '%v' COMMENT '%v'", tableName, columnName, defaultValue, comment))
			if err != nil {
				return err
			}
		}
	}

	return nil
}
